

package jumavidesktop.Persistencia.Dao.Implementaciones;

import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.persistence.EntityManager;
import jumavidesktop.Otros.Pojos.FiltroMovimientos;
import jumavidesktop.Otros.Pojos.MyRespuesta;
import jumavidesktop.Otros.Pojos.consNamed;
import jumavidesktop.Persistencia.Dao.AbstractDAO;
import jumavidesktop.Persistencia.Dao.Interfaces.IDaoCamaras;
import jumavidesktop.Persistencia.Dao.Interfaces.IDaoMatriculas;
import jumavidesktop.Persistencia.Dao.Interfaces.IDaoMovimientos;
import jumavidesktop.Persistencia.entidades.Camara;
import jumavidesktop.Persistencia.entidades.Matricula;
import jumavidesktop.Persistencia.entidades.Movimientos;

/**
 *
 * @author vimso
 */
public class DaoMovimientos extends AbstractDAO<Movimientos> implements IDaoMovimientos {

    public DaoMovimientos() {
        super();
    }
    
    public DaoMovimientos( EntityManager entityManager) {
        super(entityManager);
    }
    
    @Override
    public MyRespuesta verificarDatosMinimos(Movimientos entidad) {
        
        MyRespuesta respusta= new MyRespuesta();
        //tiene que tener una matrícula y debe provenir de una camara
        
        if (entidad.getCamaraid()==null) {
            respusta.addError("Debe especificar una cámara para saber de cual procede");
        }
        
        if (entidad.getMatricula()==null) {
            respusta.addError("Debe especificar una matrícula para saber de cual procede");
        }
        
        if (entidad.getFechaYHora()==null) {
            respusta.addError("Debe especificar una fecha de registro");
        }
        
        if (entidad.getMovimiento()==null) {
            respusta.addError("Debe especificar el tipo de movimiento");
        }
        
        if (entidad.getFoto()==null) {
            respusta.addError("Debe especificar la ruta del fichero donde se guardará la imagen");
        }
        
        return respusta;
                
    }

    @Override
    public MyRespuesta verificarEntidadAlGuardar(Movimientos entidad) {
        return this.verificarDatosMinimos(entidad);
    }

    @Override
    public MyRespuesta verificarEntidadAlModificar(Movimientos entidad) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public MyRespuesta verificarEntidadAlEliminar(Movimientos entidad) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public MyRespuesta registraMovimiento(Movimientos mv) {
        System.out.println("Registrando movimientos");
        //Obtengo la camara y la matricula de la base de datos(para que las entidades sean las mismas)
        IDaoMatriculas daoMatriculas= new DaoMatriculas(this.entityManager);
        IDaoCamaras daoCamaras= new DaoCamaras(this.entityManager);
        
        Matricula matri= daoMatriculas.encuentraEntidad(mv.getMatricula().getMatricula());
        Camara camara=daoCamaras.encuentraEntidad(mv.getCamaraid().getId());
        
        mv.setCamaraid(camara);
        mv.setMatricula(matri);
        
        return this.agregarElemento(mv);        
    }

    @Override
    public List<Movimientos> getMovimientosByMatricula(Matricula matricula) {
        
        consNamed parNamed=new consNamed(Movimientos.BUSCAR_POR_MATRICULA);
        parNamed.addParametros(Movimientos.PA_BUSCAR_MATRICULA, matricula);
        return this.consultaNMBBDD(parNamed);
    }

    @Override
    public List<Movimientos> getMovimientosByCamaras(Camara camara) {        
        consNamed parNamed=new consNamed(Movimientos.BUSCAR_POR_CAMARA);
        parNamed.addParametros(Movimientos.PA_BUSCAR_CAMARA, camara);
        return this.consultaNMBBDD(parNamed);
    }

    @Override
    protected Class getClase() {
        return Movimientos.class;
    }

    @Override
    public boolean tieneRegistros() {
        return this.existenRegistros();
    }

    @Override
    public Movimientos encuentraEntidad(Object id) {
        return this.encuentraRegistro(Movimientos.class, id);
    }

    @Override
    public List<Movimientos> getMovimientosByFiltros(FiltroMovimientos filtro) {
        //Realizo la consulta con los filtros
        
        //Me aseguro que no venga ningún campo a null
        
        if (filtro.getCamaraInicio()==null) {
            filtro.setCamaraInicio("");
        }
        
        if (filtro.getCamaraFin()==null || filtro.getCamaraFin().equals("") ) {
            filtro.setCamaraFin("ZZZZZZZZZZZZZZZZ");
        }
        
        if (filtro.getDNIFin()==null ||  filtro.getDNIFin().equals("")) {
            filtro.setDNIFin("ZZZZZZZZZZZZZZZZZZ");
        }
        
        if (filtro.getDNIInicio()==null ) {
            filtro.setDNIInicio("");
        }
        
        if (filtro.getFechaInicio()==null)  {
            Calendar  fecha=Calendar.getInstance();
            fecha.set(1900, 1, 1);
            filtro.setFechaInicio(fecha.getTime());
        }
        
        if (filtro.getFechaFin()==null) {
            Calendar  fecha=Calendar.getInstance();
            fecha.set(2100, 1, 1);
            filtro.setFechaFin(fecha.getTime());
        }
        
        if (filtro.getMatriculaFin()==null ||  filtro.getMatriculaFin().equals("")) {
            filtro.setMatriculaFin("ZZZZZZZZZZZZZZZZZZ");
        }
        
        if (filtro.getMatriculaInicio()==null ) {
            filtro.setMatriculaInicio("");
        }
        
        //Fin de comprpbaciones
        
        consNamed parNamed=new consNamed(Movimientos.BUSCAR_POR_FILTROS);
        Map<String, Object> parametros = new HashMap<String, Object>();
        //Armo los parámetros
        
        parametros.put(Movimientos.PA_BUSCAR_FILTRO_CAMARA_FIN, filtro.getCamaraFin());
        parametros.put(Movimientos.PA_BUSCAR_FILTRO_CAMARA_INICIO, filtro.getCamaraInicio());
        parametros.put(Movimientos.PA_BUSCAR_FILTRO_DNI_FIN, filtro.getDNIFin());
        parametros.put(Movimientos.PA_BUSCAR_FILTRO_DNI_INICIO, filtro.getDNIInicio());
        parametros.put(Movimientos.PA_BUSCAR_FILTRO_FECHA_FIN, filtro.getFechaFin());
        parametros.put(Movimientos.PA_BUSCAR_FILTRO_FECHA_INICIO, filtro.getFechaInicio());
        
        parametros.put(Movimientos.PA_BUSCAR_FILTRO_MATRICULA_FIN, filtro.getMatriculaFin());
        parametros.put(Movimientos.PA_BUSCAR_FILTRO_MATRICULA_INICIO, filtro.getMatriculaInicio());
        
        parNamed.setParametros(parametros);
        
        return this.consultaNMBBDD(parNamed);
        
    }
    
    

    
}
